package br.com.pnfp.web.model.dao.mysql;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.logging.Logger;

import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import br.com.pnfp.web.model.dao.IUsuarioDAO;
import br.com.pnfp.web.model.dao.exceptions.SenhaInvalidaException;
import br.com.pnfp.web.model.dao.exceptions.UsuarioInativoException;
import br.com.pnfp.web.model.dao.exceptions.UsuarioInvalidoException;
import br.com.pnfp.web.model.enums.Ativo;
import br.com.pnfp.web.model.enums.TipoUsuario;
import br.com.pnfp.web.model.vo.Empresa;
import br.com.pnfp.web.model.vo.Usuario;

@Repository
public class UsuarioDAO extends DAO implements IUsuarioDAO {
	
	private static final Logger logger = Logger.getLogger("UsuarioDAO");

	@Override
	public List<Usuario> consultar(Usuario vo) {
		Object[] params = new Object[0];
		String sql = "SELECT cd_usuario, nm_usuario, dc_login, dc_senha, dc_email, dc_telefone, cd_empresa, id_tipo, id_ativo FROM tb_usuario WHERE ";
		if(vo.getCodigo() != null && vo.getCodigo() > 0) {
			sql += "cd_usuario = ? and ";
			params = new Object[]{vo.getCodigo()};
		} else if(vo.getNome() != null && !vo.getNome().equals("")) {
			sql += "nm_usuario like '" + vo.getNome() + "%' and ";
		} else if(vo.getLogin() != null && !vo.getLogin().equals("")) {
			sql += "dc_login = '" + vo.getLogin() + "' and ";
		}
		sql += "id_ativo = 1 and cd_empresa = " + vo.getUsuarioSistema().getEmpresa().getCodigo() + " ORDER BY nm_usuario, dc_login";
		List<Usuario> lista = query(sql, params, new RowMapper<Usuario>() {
			public Usuario mapRow(ResultSet rs, int arg1) throws SQLException {
				Usuario vo = new Usuario();
				vo.setCodigo(rs.getInt("cd_usuario"));
				vo.setNome(rs.getString("nm_usuario"));
				vo.setLogin(rs.getString("dc_login"));
				vo.setSenha(rs.getString("dc_senha"));
				vo.setEmail(rs.getString("dc_email"));
				vo.setTelefone(rs.getString("dc_telefone"));
				vo.setEmpresa(new Empresa(rs.getInt("cd_empresa")));
				vo.setTipo(TipoUsuario.setValue(rs.getInt("id_tipo")));
				vo.setAtivo(Ativo.setValue(rs.getInt("id_ativo")));
				return vo;
			}			
		});
		
		return lista;
	}

	public Usuario login(Usuario vo) {
		String sql = "SELECT usuario.cd_usuario, usuario.nm_usuario, usuario.dc_login, usuario.dc_senha, usuario.id_ativo, usuario.id_tipo, usuario.cd_empresa, empresa.nm_empresa FROM tb_usuario usuario, tb_empresa empresa where usuario.cd_empresa = empresa.cd_empresa and dc_login = ?";
		List<Usuario> lista = query(sql, new Object[]{vo.getLogin()}, new RowMapper<Usuario>() {
			public Usuario mapRow(ResultSet rs, int arg1) throws SQLException {
				Usuario vo = new Usuario();
				vo.setCodigo(rs.getInt("usuario.cd_usuario"));
				vo.setNome(rs.getString("usuario.nm_usuario"));
				vo.setLogin(rs.getString("usuario.dc_login"));
				vo.setSenha(rs.getString("usuario.dc_senha"));
				vo.setAtivo(Ativo.setValue(rs.getInt("usuario.id_ativo")));
				vo.setTipo(TipoUsuario.setValue(rs.getInt("usuario.id_tipo")));
				vo.setEmpresa(new Empresa(rs.getInt("usuario.cd_empresa")));
				vo.getEmpresa().setNome(rs.getString("empresa.nm_empresa"));
				return vo;
			}			
		});
		
		Usuario usuario = null;
		if(lista.size() == 1) {
			usuario = lista.get(0);
		} else if(lista.size() > 1) {
			for(Usuario u : lista) {
				if(u.getSenha().equals(vo.getSenha())) {
					usuario = u;
				}
			}
		}
		
		
		if(usuario == null) {
			logger.warning("Usuario Invalido : " + vo.getLogin());
			throw new UsuarioInvalidoException();
		} else if(!usuario.getSenha().equals(vo.getSenha())) {
			logger.warning("Senha Invalida : " + vo.getLogin() + " - " + vo.getSenha());
			throw new SenhaInvalidaException();
		} else if(usuario.getAtivo().equals(Ativo.NAO)) {
			throw new UsuarioInativoException();
		}
		
		return usuario;
	}
	
	@Override
	public void alterar(Usuario vo) {
		String sql = "UPDATE tb_usuario set dc_senha = ?, nm_usuario = ?, dc_email = ?, dc_telefone = ?, id_tipo = ? where cd_usuario = ?";
		update(sql, new Object[] {vo.getSenha(), vo.getNome(), vo.getEmail(), vo.getTelefone(), vo.getTipo().getValue(), vo.getCodigo()});
		
	}
	
	@Override
	public void excluir(Integer id) {
		try {
			String sql = "DELETE FROM tb_usuario where cd_usuario = ?";
			update(sql, new Object[] {id});
		} catch(DataIntegrityViolationException e) {
			String sql = "UPDATE tb_usuario set id_ativo = 0 where cd_usuario = ?";
			update(sql, new Object[] {id});			
		}	
	}
	
	@Override
	public void incluir(Usuario vo) {
		String sql = "INSERT INTO tb_usuario(nm_usuario, dc_login, dc_senha, dc_email, dc_telefone, cd_empresa, id_tipo, id_ativo) values(?,?,?,?,?,?,?,?)";
		update(sql, new Object[] {vo.getNome(), vo.getLogin(), vo.getSenha(), vo.getEmail(), vo.getTelefone(), vo.getEmpresa().getCodigo(), vo.getTipo().getValue(), 1});
		
	}
}
